package com.xya.algorithm.selection;

import java.util.Arrays;

/**
 * ******************************************************************************************************
 * 中文名称  *     英文名称    *  平均时间复杂度  *  最坏时间复杂度  *  最好时间复杂度  *  空间复杂度  *  稳定性  *
 * ******************************************************************************************************
 * 选择排序  *    Selection   *      n^2       *       n^2      *      n^2       *      1      *  不稳   *
 * ******************************************************************************************************
 */
public class SelectionSort {

    public static void sort(int[] arr) {
        int minPos;
        for (int i = 0; i < arr.length -1; i++) {
            minPos = i;
            for (int j = i + 1; j < arr.length; j++) {
                //用数组第一个数和后面的数对比，将小的放在第一位
                minPos = arr[j] < arr[minPos] ? j : minPos;
            }
            //交换小的数组元素
            swap(arr, i, minPos);
        }
    }

    public static void sort2(int[] arr) {
        int minPos;
        int maxPos;

        for (int i = 0; i < arr.length / 2; i++) {
            minPos = i;
            maxPos = i;
            for (int j = i + 1; j < arr.length - i; j++) {
                //用数组第一个数和后面的数对比，将小的放在第一位
                minPos = arr[j] < arr[minPos] ? j : minPos;
                maxPos = arr[j] > arr[maxPos] ? j : maxPos;
            }

//            System.out.println("待交换的最小值位置[ "+i + "->" + minPos+" ]");
//            System.out.println("待交换的最大值位置[ "+((arr.length - 1) - i) + "->" + maxPos+" ]");
            //交换小的数组元素
            if(i != minPos)
                swap(arr, i, minPos);
            if(i == maxPos) {
                swap(arr, (arr.length - 1) - i, minPos);
            } else {
                swap(arr, (arr.length - 1) - i, maxPos);
            }

        }
    }

    private static void swap(int[] arr, int i, int j) {
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }

    public static void main(String[] args) {
        int[] arr = new int[]{5, 2, 1, 4, 3, 6};

//        SelectionSort.sort(arr);

        SelectionSort.sort2(arr);

        System.out.println(Arrays.toString(arr));
    }
}
